package pe.com.cotelasa.scp.entidad;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;

/**
 * The persistent class for the guia_remision database table.
 * 
 */
@NamedQueries({
	@NamedQuery(
	name = "findNumerosGuias",
	query = "select s.numeroGuia from GuiaRemision s where s.estadoRegistro = :estadoRegistro"
	)
})
@Entity
@Table(name = "guia_remision",catalog = "bdcotelasa", schema = "cotelasa")
public class GuiaRemision implements Serializable {
    
    
	private static final long serialVersionUID = 1L;

	@Id
	@SequenceGenerator(name = "generadorGuiaRemision", sequenceName = "cotelasa.guia_remision_id_seq")
        @GeneratedValue(generator = "generadorGuiaRemision")
        @Basic(optional = false)
        @Column(name = "id")
	private Integer id;

	@Column(name = "constancia_inscripcion")
	private String constanciaInscripcion;

	@Column(name = "costo_minimo_traslado")
	private BigDecimal costoMinimoTraslado;

	@Column(name = "direccion_destinatario")
	private String direccionDestinatario;

	@Column(name = "dni_destinatario")
	private String dniDestinatario;
        
        @Basic(optional=false)
	@Column(name = "estado_guia")
	private String estadoGuia;

        @Basic(optional=false)
	@Column(name = "estado_registro")
	private String estadoRegistro;

        @Basic(optional=false)
	@Column(name = "fec_creacion")
	private Date fecCreacion;

	@Column(name = "fec_modificacion")
	private Date fecModificacion;

	@Column(name = "fecha_emision")
	private Date fechaEmision;
        
        @Basic(optional = false)
        @NotNull
        @Column(name = "esta_entregado")
        private short estaEntregado;
        
	@Column(name = "fecha_inicio_traslado")
	private Date fechaInicioTraslado;

	@Column(name = "licencia_conductor")
	private String licenciaConductor;

	@Column(name = "marca_vehiculo")
	private String marcaVehiculo;

	@Column(name = "nombre_conductor")
	private String nombreConductor;

	@Column(name = "nombre_destinatario")
	private String nombreDestinatario;

	@Column(name = "numero_doc_referencia")
	private String numeroDocReferencia;

        @Basic(optional=false)
	@Column(name = "numero_guia")
	private String numeroGuia;

	@Column(name = "placa_vehiculo")
	private String placaVehiculo;

        @Basic(optional=false)
	@Column(name = "ruc_destinatario")
	private String rucDestinatario;

        @Basic(optional=false)
	@Column(name = "serie")
        private String serie;

        @Basic(optional=false)
	@Column(name = "usr_creacion")
	private String usrCreacion;

	@Column(name = "usr_modificacion")
	private String usrModificacion;
        
        @Column(name = "cantidad_total")
	private BigDecimal cantidadTotal;
        
        @Column(name = "unidad")
	private String unidad;
        
        @Basic(optional = false)
        @Column(name = "tipo_compago")
        private Integer tipoCompPago;
        
        @Column(name = "id_venta_facturacion")
	private Integer idVentaFacturacion;
        
	// bi-directional many-to-one association to DetalleGuiaRemision
	@OneToMany(mappedBy = "guiaRemision", cascade=CascadeType.ALL,fetch=FetchType.LAZY)
	private List<DetalleGuiaRemision> detalleGuiaRemisions;

	// bi-directional many-to-one association to OrdenPedido
	@ManyToOne(fetch=FetchType.LAZY, optional=true)
	@JoinColumn(name = "id_orden_pedido")
	private OrdenPedido ordenPedido;
	
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name = "id_motivo_guia")
	private ParametroDetalle parametroMotivoGuia;
	
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name = "id_tipo_guia")
	private ParametroDetalle parametroTipoGuia;

	// bi-directional many-to-one association to Sede
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name = "id_sede_llegada")
	private Sede sedeLlegada;

	// bi-directional many-to-one association to Sede
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name = "id_sede_partida")
	private Sede sedePartida;
        
        @JoinColumn(name = "id_orden_compra_servicio", referencedColumnName = "id")
        @ManyToOne(fetch = FetchType.LAZY, optional = true)
        private OrdenCompraServicio idOrdenCompraServicio;
        
        @JoinColumn(name = "id_empresa", referencedColumnName = "id")
        @ManyToOne(fetch = FetchType.LAZY, optional = false)
        private Empresa idEmpresa;
        
        @JoinColumn(name = "id_factura", referencedColumnName = "id")
        @ManyToOne(fetch = FetchType.LAZY)
        private CompraFacturacion idFactura;
        
        @OneToMany(mappedBy="idGuiaRemision",fetch=FetchType.LAZY)
        private List<Kardex> kardexCollection;
        
    public CompraFacturacion getIdFactura() {
        return idFactura;
    }

    public void setIdFactura(CompraFacturacion idFactura) {
        this.idFactura = idFactura;
    }

    public List<Kardex> getKardexCollection() {
        return kardexCollection;
    }

    public void setKardexCollection(List<Kardex> kardexCollection) {
        this.kardexCollection = kardexCollection;
    }

    public short getEstaEntregado() {
        return estaEntregado;
    }

    public void setEstaEntregado(short estaEntregado) {
        this.estaEntregado = estaEntregado;
    }

    public Empresa getIdEmpresa() {
        return idEmpresa;
    }

    public void setIdEmpresa(Empresa idEmpresa) {
        this.idEmpresa = idEmpresa;
    }

    public BigDecimal getCantidadTotal() {
        return cantidadTotal;
    }

    public void setCantidadTotal(BigDecimal cantidadTotal) {
        this.cantidadTotal = cantidadTotal;
    }

    public String getUnidad() {
        return unidad;
    }

    public void setUnidad(String unidad) {
        this.unidad = unidad;
    }

    /**
     * @return the tipoCompPago
     */
    public Integer getTipoCompPago() {
        return tipoCompPago;
    }

    /**
     * @param tipoCompPago the tipoCompPago to set
     */
    public void setTipoCompPago(Integer tipoCompPago) {
        this.tipoCompPago = tipoCompPago;
    }

    public Integer getIdVentaFacturacion() {
        return idVentaFacturacion;
    }

    public void setIdVentaFacturacion(Integer idVentaFacturacion) {
        this.idVentaFacturacion = idVentaFacturacion;
    }

	public enum ESTADO_GUIA_REMISION {
		BORRADOR('B'), ANULADO('N'), EMITIDO('E');
		private char estado;

		private ESTADO_GUIA_REMISION(char estado) {
			this.estado = estado;
		}

		public char getValor() {
			return estado;
		}
	}
	
	@Column(name = "observacion")
	private String observacion;

	public GuiaRemision() {
		parametroTipoGuia = new ParametroDetalle();
		detalleGuiaRemisions = new ArrayList<DetalleGuiaRemision>();
		sedePartida = new Sede();
		sedeLlegada = new Sede();
	}

	public Integer getId() {
		return this.id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getConstanciaInscripcion() {
		return this.constanciaInscripcion;
	}

	public void setConstanciaInscripcion(String constanciaInscripcion) {
		this.constanciaInscripcion = constanciaInscripcion;
	}

	public BigDecimal getCostoMinimoTraslado() {
		return this.costoMinimoTraslado;
	}

	public void setCostoMinimoTraslado(BigDecimal costoMinimoTraslado) {
		this.costoMinimoTraslado = costoMinimoTraslado;
	}

	public String getDireccionDestinatario() {
		return this.direccionDestinatario;
	}

	public void setDireccionDestinatario(String direccionDestinatario) {
		this.direccionDestinatario = direccionDestinatario;
	}

	public String getDniDestinatario() {
		return this.dniDestinatario;
	}

	public void setDniDestinatario(String dniDestinatario) {
		this.dniDestinatario = dniDestinatario;
	}


	@Transient
	public String getDescEstadoGuia() {
		switch (estadoGuia.charAt(0)) {
			case 'A':
				return ESTADO_GUIA_REMISION.ANULADO.name();
			case 'B':
				return ESTADO_GUIA_REMISION.BORRADOR.name();
			default:
				return ESTADO_GUIA_REMISION.EMITIDO.name();
		}
	}

	public String getEstadoGuia() {
		return this.estadoGuia;
	}

	public void setEstadoGuia(String estadoGuia) {
		this.estadoGuia = estadoGuia;
	}

	public String getEstadoRegistro() {
		return this.estadoRegistro;
	}

	public void setEstadoRegistro(String estadoRegistro) {
		this.estadoRegistro = estadoRegistro;
	}

	public Date getFecCreacion() {
		return this.fecCreacion;
	}

	public void setFecCreacion(Date fecCreacion) {
		this.fecCreacion = fecCreacion;
	}

	public Date getFecModificacion() {
		return this.fecModificacion;
	}

	public void setFecModificacion(Date fecModificacion) {
		this.fecModificacion = fecModificacion;
	}

	public Date getFechaEmision() {
		return this.fechaEmision;
	}

	public void setFechaEmision(Date fechaEmision) {
		this.fechaEmision = fechaEmision;	
	}
	
	public Date getFechaInicioTraslado() {
		return fechaInicioTraslado;
	}

	public void setFechaInicioTraslado(Date fechaInicioTraslado) {
		this.fechaInicioTraslado = fechaInicioTraslado;
	}

	public String getLicenciaConductor() {
		return this.licenciaConductor;
	}

	public void setLicenciaConductor(String licenciaConductor) {
		this.licenciaConductor = licenciaConductor;
	}

	public String getMarcaVehiculo() {
		return this.marcaVehiculo;
	}

	public void setMarcaVehiculo(String marcaVehiculo) {
		this.marcaVehiculo = marcaVehiculo;
	}

	public String getNombreConductor() {
		return this.nombreConductor;
	}

	public void setNombreConductor(String nombreConductor) {
		this.nombreConductor = nombreConductor;
	}

	public String getNombreDestinatario() {
		return this.nombreDestinatario;
	}

	public void setNombreDestinatario(String nombreDestinatario) {
		this.nombreDestinatario = nombreDestinatario;
	}

	public String getNumeroDocReferencia() {
		return this.numeroDocReferencia;
	}

	public void setNumeroDocReferencia(String numeroDocReferencia) {
		this.numeroDocReferencia = numeroDocReferencia;
	}

	public String getNumeroGuia() {
		return this.numeroGuia;
	}

	public void setNumeroGuia(String numeroGuia) {
		this.numeroGuia = numeroGuia;
	}

	public String getPlacaVehiculo() {
		return this.placaVehiculo;
	}

	public void setPlacaVehiculo(String placaVehiculo) {
		this.placaVehiculo = placaVehiculo;
	}

	public String getRucDestinatario() {
		return this.rucDestinatario;
	}

	public void setRucDestinatario(String rucDestinatario) {
		this.rucDestinatario = rucDestinatario;
	}

	public String getSerie() {
		return this.serie;
	}

	public void setSerie(String serie) {
		this.serie = serie;
	}

	public String getUsrCreacion() {
		return this.usrCreacion;
	}

	public void setUsrCreacion(String usrCreacion) {
		this.usrCreacion = usrCreacion;
	}

	public String getUsrModificacion() {
		return this.usrModificacion;
	}

	public void setUsrModificacion(String usrModificacion) {
		this.usrModificacion = usrModificacion;
	}

	public List<DetalleGuiaRemision> getDetalleGuiaRemisions() {
		return this.detalleGuiaRemisions;
	}

	public void setDetalleGuiaRemisions(
			List<DetalleGuiaRemision> detalleGuiaRemisions) {
		this.detalleGuiaRemisions = detalleGuiaRemisions;
	}

	public OrdenPedido getOrdenPedido() {
		return this.ordenPedido;
	}

	public void setOrdenPedido(OrdenPedido ordenPedido) {
		this.ordenPedido = ordenPedido;
	}

	public ParametroDetalle getParametroMotivoGuia() {
		return parametroMotivoGuia;
	}

	public void setParametroMotivoGuia(ParametroDetalle parametroMotivoGuia) {
		this.parametroMotivoGuia = parametroMotivoGuia;
	}

	public ParametroDetalle getParametroTipoGuia() {
		return parametroTipoGuia;
	}

	public void setParametroTipoGuia(ParametroDetalle parametroTipoGuia) {
		this.parametroTipoGuia = parametroTipoGuia;
	}

	public Sede getSedeLlegada() {
		return sedeLlegada;
	}

	public void setSedeLlegada(Sede sedeLlegada) {
		this.sedeLlegada = sedeLlegada;
	}

	public Sede getSedePartida() {
		return sedePartida;
	}

	public void setSedePartida(Sede sedePartida) {
		this.sedePartida = sedePartida;
	}
	
	public String getObservacion() {
		return observacion;
	}

	public void setObservacion(String observacion) {
		this.observacion = observacion;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		GuiaRemision other = (GuiaRemision) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}
    @Override
    public String toString() {
        return "pe.com.cotelasa.scp.entidad.GuiaRemision[ id=" + id + " ]";
    }



    public OrdenCompraServicio getIdOrdenCompraServicio() {
        return idOrdenCompraServicio;
    }

    public void setIdOrdenCompraServicio(OrdenCompraServicio idOrdenCompraServicio) {
        this.idOrdenCompraServicio = idOrdenCompraServicio;
    }


    }
